package tema10.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tema10.persistence.ContactoDAO;
import tema10.persistence.ContactoPersistFactory;
import tema10.model.Contacto;

//@WebServlet(name="CreateServlet", urlPatterns={"/tema10/createServlet"})
public class CreateServlet extends BasicUtilitiesServlet {
   
    @Override
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ContactoDAO persistenceManager = ContactoPersistFactory.getContactoDAO(persistenceMechanism);
        Contacto contacto = generateContactoFromRequest(request);
        if (contacto != null && persistenceManager.createContacto(contacto)) {
            request.setAttribute("contacto", contacto);
            request.setAttribute("operacion", "INSERTADO");
            request.setAttribute("persistencia", persistenceMechanism);
            gotoURL(successForm, request, response);
        } else {
            gotoURL(errorForm, request, response);
        }
    }

    Contacto generateContactoFromRequest(HttpServletRequest request) throws NumberFormatException {
        Contacto contacto = new Contacto();
        String nombre = request.getParameter("nombre");
        String apellidos = request.getParameter("apellidos");
        String telefono = request.getParameter("telefono");
        String fechaNacimientoDia = request.getParameter("fechaNacimientoDia").trim();
        String fechaNacimientoMes = request.getParameter("fechaNacimientoMes").trim();
        String fechaNacimientoAnho = request.getParameter("fechaNacimientoAnho").trim();
        String informacion = request.getParameter("informacion");
        boolean valid = valiateName(nombre) && valiateName(apellidos) && valiatePhone(telefono)
                && valiateDate(fechaNacimientoDia,fechaNacimientoMes,fechaNacimientoAnho);
        if (!valid) {
            return null;
        }
        int anho = Integer.parseInt(fechaNacimientoAnho);
        int mes = Integer.parseInt(fechaNacimientoMes);
        int dia = Integer.parseInt(fechaNacimientoDia);
        contacto.setNombre(nombre);
        contacto.setApellidos(apellidos);
        contacto.setTelefono(telefono);
        contacto.setFechaNacimiento(anho, mes, dia);
        contacto.setInformacion(informacion);
        return contacto;
    }

    boolean valiateName(String name) {
        boolean isGoodLength = checkLength(name, 1, 30);
        String namePattern = "[A-Z]([a-zA-ZñÑáéíóúÁÉÍÓÚ ])*";
        return name.matches(namePattern) && isGoodLength;
    }

    boolean valiatePhone(String phone) {
        boolean isGoodLength = checkLength(phone, 9, 15);
        return phone.matches("([0-9  +])*") && isGoodLength;
    }

    boolean valiateDate(String dia,String mes,String anho) {
        if (checkLength(dia, 1, 2) && checkLength(mes, 1, 2) && checkLength(anho, 4, 4)) {
            if (dia.matches("([0-9])*") && mes.matches("([0-9])*") && anho.matches("([0-9])*")) {
            int diaInt = Integer.valueOf(dia);
            int mesInt = Integer.valueOf(mes);
            int anhoInt = Integer.valueOf(anho);
            return ( (diaInt <= 31) && (diaInt > 0) && (mesInt <= 12) && (mesInt > 0)
                    && (anhoInt <= 1997) && (anhoInt >= 1988) );
            }
        }
        return false;
    }

    private boolean checkLength(String data, int minAceptable, int maxAceptable) {
        int length = data.length();
        boolean isGoodLength = length >= minAceptable && length <= maxAceptable;
        return isGoodLength;
    }
}
